# -*- coding: utf-8 -*-
# @Time    : 20210606
# @Author  : 柿子
# @File    : task.py

import pandas as pd


def convent_min2float(x):
    """
    对分钟的60进制转为10进制
    """
    if "'" in str(x):
        x = str(x).split("'")
        x2 = x[1].replace('"', "") if len(x) > 1 else "0"
        return (int(x[0]) * 60 + int(x2)) / 60
    else:
        return x


def revese_float2sec(x):
    """
    逆向回复分钟,将10进制转为60进制
    """
    if x != None:
        x = x * 60
        return str(int(x // 60)) + "'" + str(int(x % 60))


def data_refomat(dataframe):
    """
    对数据类型进行标准化,将所有数值类型转为float
    """
    tdf = dataframe.copy()
    col_l = dataframe.columns.tolist()
    # print(col_l[2])
    tdf[col_l[2]] = tdf[col_l[2]].map(convent_min2float)
    col_l.remove("性别")
    col_l.remove("班级")
    tdf[col_l] = tdf[col_l].astype(float)
    tdf["BMI"] = dataframe["体重"] / ((dataframe["身高"] / 100) ** 2)
    tdf["BMI"] = tdf["BMI"].round(2)
    return tdf


def mark_out(students, standard):
    """
    进行分数匹配
    """
    ttdf = students.iloc[:, :2]
    # ----------------主循环--------------- #
    for col in students.columns[2:-3]:
        # print(col)

        # 提取分数
        # 体前屈数据中含有空值,由于判别单位不明因此进行整体剔除
        sc = standard[col].dropna(axis=0)
        # print(sc)

        # 对包含分组数据的进行类型转化
        res = sc["成绩"].apply(convent_min2float).astype(float).tolist()
        score = sc["分数"].to_list()

        # 时间单位的越小越好，其余越大越好
        if "跑" in col:  # 有时间单位有关的只有跑步运动
            res.insert(0, students[col].min() * 0.7)
        else:
            res.insert(0, students[col].max() * 1.5)
            res, score = res[::-1], score[::-1]

        ttdf[col + "数值"] = (
            students[col].map(revese_float2sec)
            if col in ["男1000米跑", "女800米跑"]
            else students[col]
        )  # 逆向回转，将分钟数据恢复

        # print(score)

        # 观察数据后发现，体前屈成绩中没有负数的，
        # 由于无法进行有效判断，因此决定不做修改
        # 另外对排序本身并无影响。
        # t = students[col].replace({0: -100}) # 体前屈包含负值，因此需要进行过滤，否则未参加考试的人员
        t = students[col]

        ttdf[col + "分数"] = pd.cut(
            x=t,  # 学生数据
            bins=res,  # 分组信息
            labels=score,  # 分组标签
            right=True,
        )

    # 重新赋予基本信息
    ttdf[["身高", "体重", "BMI"]] = students[["身高", "体重", "BMI"]]
    return ttdf


def sort_out(dataframe):
    c = []
    for col in dataframe.columns:
        if "分数" in col:
            c.append(col)
    sort = dataframe[c].astype(float)
    sort.fillna(0)
    dataframe["total_score"] = sort.sum(axis=1)
    return (
        dataframe.sort_values(by="total_score", ascending=False)
        .reset_index()
        .drop(columns="index")
    )


def run(name, dataframe, standard):
    tdf = data_refomat(dataframe)
    tdf = mark_out(tdf, standard)
    o = sort_out(tdf)
    print(o)
    # o.to_csv("{}_student.csv".format(name))



if __name__ == "__main__":
    standard = pd.read_excel("./体侧成绩评分表.xls", header=[0, 1])
    for i in range(2):
        run(
            "female" if i == 1 else "male",
            pd.read_excel("./18级高一体测成绩汇总.xls", sheet_name=i),
            standard,
        )
